////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxpdlibraryhandler.h
/// @brief This class handle creation  of PD Library
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXPDLIBRARYHANDLER_H
#define CAMXPDLIBRARYHANDLER_H

#include "chipdlibinterface.h"

#include "camxstatscommon.h"

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief This class handles PD library creation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CPDLibHandler
{
public:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateLib
    ///
    /// @brief  This method creates an instance to the PD Lib
    ///
    /// @param  pfnCreate      Function Pointer to create Algorithm instance
    /// @param  ppPDLibPtr     Pointer to the created PD Lib instance
    /// @param  pPDAFLibName   PD Library Name to be load
    /// @param  cameraId       Camera Id for PD library to identify instance Id
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult CreateLib(
        CREATEPD    pfnCreate,
        CHIPDLib**  ppPDLibPtr,
        CHAR*       pPDAFLibName,
        UINT32      cameraId);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CPDLibHandler
    ///
    /// @brief  constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CPDLibHandler();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~CPDLibHandler
    ///
    /// @brief  destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~CPDLibHandler();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// LoadPDLib
    ///
    /// @brief  Load algorithm Lib
    ///
    /// @param  hHandle         Handle to the Lib
    /// @param  pLibPath        Path to the Lib
    /// @param  pLibName        Name of Lib
    /// @param  pFunctionName   Name of the function
    ///
    /// @return custom loaded lib address
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID* LoadPDLib(
        CamX::OSLIBRARYHANDLE*  hHandle,
        const CHAR*             pLibPath,
        const CHAR*             pLibName,
        const CHAR*             pFuncName);

    CPDLibHandler(const CPDLibHandler&)            = delete;    ///< Do not implement copy constructor
    CPDLibHandler& operator=(const CPDLibHandler&) = delete;    ///< Do not implement assignment operator

    OSLIBRARYHANDLE m_hHandle;                                          ///< Handle to the loaded library
};

CAMX_NAMESPACE_END

#endif // CAMXPDLIBHANDLER_H
